home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / misc / scode.arc / cbw2ps.c next >
C/C++ Source or Header  |  1987-08-25  |  7KB  |  356 lines

  1. /*
  2.  * Compressed ST screen (monochrome) to Postscript filter.
  3.  *
  4.  * By Moshe Braner, 861116.
  5.  *
  6.  * Postscript stuff from:
  7.  *    Cwru standard bitmap image to PostScript filter,
  8.  *    by J. R. Bammi.
  9.  *
  10.  * WARNING: assumes ASCII.
  11.  *
  12.  * Usage:
  13.  *
  14.  *  cbw2ps [-s xsize ysize] [-t transx transy] [-r rot] [-l] [-i] file
  15.  *
  16.  *    -s xsize ysize = size of postscript image - default 8.533 x 5.333"
  17.  *    -1        = 1 dot per pixel      - 2.133 x 1.333 inches
  18.  *    -2        = 2 dots per pixel      - 4.267 x 2.667
  19.  *    -3        = 3 dots per pixel      - 6.4   x 4
  20.  *    -4        = 4 dots per pixel      - 8.533 x 5.333 (default)
  21.  *    -5        = 5 dots per pixel      - 10.67 x 6.667
  22.  *    -t transx transy = translate image      - default 0.25 0.5 inches
  23.  *    -r rotate    = rotate image          - default 0 degrees
  24.  *    -l        = landscape (== -r 90)      - default portrait
  25.  *    -i        = inverse image          - default no inverse
  26.  */
  27.  
  28. #include <stdio.h>
  29.  
  30. #define    OK    0
  31. #define    ERROR    -1
  32.  
  33. FILE    *fp, *fopen();
  34. char    scrn[32000];    /* virtual screen buffer        */
  35. char    *scrnptr;    /* target address for next decoded byte    */
  36. long    chksum;        /* chksum on input file            */
  37. int    rows;
  38. int    cols;
  39. int    row;
  40. int    col;
  41. int    bferr = 0;
  42.  
  43. main(argc,argv)
  44.     int argc;
  45.     char **argv;
  46. {
  47.     int land, inv;
  48.     char *filename;
  49.     double sizex, sizey, transx, transy, rotate;
  50.     extern double atof();
  51.         
  52.     fp = stdin;
  53.     land = 0;
  54.     inv = 0;
  55.     filename = "STDIN";
  56.     sizex = 8.533333;
  57.     sizey = 5.333333;
  58.     transx = 0.25;
  59.     transy = 0.5;
  60.     rotate = 0.0;
  61.         
  62.     while(--argc > 0) {
  63.         ++argv;
  64.         if((*argv)[0] == '-') {
  65.             switch((*argv)[1]) {
  66.  
  67.                 case 'l':
  68.                 case 'L':
  69.                 land = 1;
  70.                 break;
  71.  
  72.                 case 's':
  73.                 case 'S':
  74.                 sizex = atof(*++argv);
  75.                 sizey = atof(*++argv);
  76.                 argc -= 2;
  77.                 break;
  78.  
  79.                 case 't':
  80.                 case 'T':
  81.                 transx = atof(*++argv);
  82.                 transy = atof(*++argv);
  83.                 argc -= 2;
  84.                 break;
  85.  
  86.                 case 'r':
  87.                 case 'R':
  88.                 rotate = atof(*++argv);
  89.                 argc--;
  90.                 break;
  91.  
  92.                 case 'I':
  93.                 case 'i':
  94.                 inv = 1;
  95.                 break;
  96.  
  97.                 case '1':
  98.                 sizex = 2.133333;
  99.                 sizey = 1.333333;
  100.                 break;
  101.  
  102.                 case '2':
  103.                 sizex = 4.26667;
  104.                 sizey = 2.66667;
  105.                 break;
  106.  
  107.                 case '3':
  108.                 sizex = 6.4;
  109.                 sizey = 4.0;
  110.                 break;
  111.  
  112.                 case '4':
  113.                 sizex = 8.533333;
  114.                 sizey = 5.333333;
  115.                 break;
  116.  
  117.                 case '5':
  118.                 sizex = 10.66667;
  119.                 sizey = 6.66667;
  120.                 break;
  121.  
  122.                 default:
  123.                 fprintf(stderr,
  124.                     "Illegal switch \'%c\' - ignored\n",
  125.                     (*argv)[1]);
  126.             }
  127.         } else {
  128.             if((fp = fopen(*argv, "r")) == (FILE *)NULL) {
  129.                 fprintf(stderr,"Cannot open %s\n",*argv);
  130.                 exit(1);
  131.             }
  132.             filename = *argv;
  133.         }
  134.     }
  135.     process(land,inv,filename,sizex,sizey,transx,transy,rotate);
  136. }
  137.  
  138. process(land, inv, filename, sizex, sizey, transx, transy, rotate)
  139.     int land, inv;
  140.     char *filename;
  141.     double sizex, sizey, transx, transy, rotate;
  142. {
  143.     int bpp, xmax, ymax, junk;
  144.     register long  i;
  145.     long bytes, origsum;
  146.     register unsigned int c, s, out, mask;
  147.     register int j, bpb, shift, k;
  148.     extern unsigned int decode3();
  149.  
  150.     c = fgetb() - 0x10;
  151.     chksum = ((long) c)&0x03;
  152.     if (c != 2) {
  153.         fprintf(stderr,
  154.             "%s not a monochrome image!\n",filename);
  155.         exit(1);
  156.     }
  157.  
  158.     bpp = 1;
  159.     ymax = 400;
  160.     xmax = 640;
  161.  
  162.     /* Scan off color table */
  163.  
  164.     c = decode3();
  165.     chksum += ((long) c)&0xFFFF;
  166.     if ((c & 0x01) == 1)
  167.         inv = (! inv);
  168.     for(i = 0; i < 15; i++)
  169.         chksum += ((long) decode3())&0xFFFF;
  170.  
  171.     /* decode the image itself */
  172.  
  173.     rows = 400;
  174.     cols = 80;
  175.     row = 0;
  176.     col = 0;
  177.     scrnptr = scrn;
  178.     while ((c=fgetb()) != ERROR) {
  179.         if (c > 0x0F)
  180.             s = reps(c);
  181.         else
  182.             s = uniq(c);
  183.         if (s != OK)
  184.             break;
  185.     }
  186.  
  187.     /* read original checksum */
  188.  
  189.     origsum = (((long) decode3())&0xFFFF) << 16;
  190.     origsum += ((long) decode3())&0xFFFF;
  191.     if (bferr) {
  192.         fprintf(stderr,"Error while reading %s\n",
  193.             filename);
  194.         exit(3);
  195.     } else if (chksum != origsum) {
  196.         fprintf(stderr,"Checksum doesn't fit!\n");
  197.         exit(3);
  198.     }
  199.  
  200.     fclose(fp);
  201.  
  202.     /* Put out header */
  203.  
  204.     printf("%%!\n/inch {72 mul} def\n");
  205.     printf("/picstr 1 string def\n");
  206.     printf("/bpp %d def\n",bpp);
  207.     printf("/scanlines %d def\n",ymax);
  208.     printf("/scansize %d def\n", xmax);
  209.     printf("/bitmapx\n{");
  210.     printf(" %d %d %d [%d 0 0 %d 0 %d]",
  211.         xmax, ymax, bpp, xmax,-ymax,ymax);
  212.     printf(" {currentfile picstr readhexstring pop} image\n} def\n");
  213.     printf("gsave\n");
  214.     printf("%f inch %f inch translate\n",transx, transy);
  215.     printf("%f rotate\n", (land == 1)? 90.0+rotate : rotate );
  216.     printf("%f inch %f inch scale\n", sizex, sizey);
  217.     printf("/clipathx\n{\tnewpath\n\t0 0 moveto\n\t%f 0 inch", sizex);
  218.     printf(" lineto\n\t%f inch %f inch lineto\n\t0 %f inch lineto\n",
  219.            sizex, sizey, sizey);
  220.     printf("\tclosepath } def\nclipathx clip\n");
  221.     printf("bitmapx\n");
  222.  
  223.     /* put out bit map data */
  224.  
  225.     scrnptr = scrn;
  226.     k = 0;
  227.     for (i=0; i<32000; i++) {
  228.         out = *scrnptr++;
  229.         printf ("%02x",
  230.             (unsigned int)(((inv == 1)? ~out : out)
  231.              & (unsigned int)0x00ff));
  232.         if (++k & 16) {
  233.             putchar('\n');
  234.             k = 0;
  235.         } else
  236.             putchar(' ');
  237.     }
  238.     printf("grestore\n");
  239.     printf("showpage\n");
  240. }
  241.  
  242. /*
  243.  * Read a byte from the input file, translate it.
  244.  * Skip control chars and white space, etc.
  245.  */
  246. int
  247. fgetb()
  248. {
  249.     register int    c;
  250. again:
  251.     if (bferr)
  252.         return (ERROR);
  253.     c = getc(fp);
  254.     if (c == EOF)
  255.         bferr = 1;
  256.     if (c < ',' || c > 'z')
  257.         goto again;
  258.     if (c < 'a')
  259.         return (c - ' ');
  260.     if (c < 'm')
  261.         return (c - 'a');
  262.     if (c < 'v')
  263.         return (c - 0x55);
  264.     return (c - 0x3B);
  265. }
  266.  
  267. /*
  268.  * Decode one (16-bit) word out of 3 bytes of the input file.
  269.  */
  270. unsigned int
  271. decode3()
  272. {
  273.     register unsigned int c;
  274.     register unsigned int dummy;    /* avoid a Megamax bug */
  275.  
  276.     c = (fgetb() << 12);
  277.     c |= (fgetb() << 6);
  278.     c |= fgetb();
  279.     return (c);
  280. }
  281.  
  282. /*
  283.  * Put a decoded byte into the screen buffer.
  284.  */
  285. int
  286. putbyte(b)
  287.     int    b;
  288. {
  289.     *scrnptr = (char) b;
  290.     scrnptr += cols;
  291.     if (++row >= rows) {
  292.         if (++col >= cols) {
  293.             return (ERROR);
  294.         }
  295.         scrnptr = scrn + col;
  296.         row = 0;
  297.     }
  298.     return (OK);
  299. }
  300.  
  301. /*
  302.  * Handle a pair of decoded screen bytes.
  303.  */
  304. int
  305. putword(w)
  306.     register unsigned int w;
  307. {
  308.     register unsigned int dummy;    /* avoid a Megamax bug */
  309.  
  310.     chksum += ((long) w)&0xFFFF;
  311.     if (putbyte((w>>8) & 0xFF) == ERROR)
  312.         return (ERROR);
  313.     return (putbyte(w & 0xFF));
  314. }
  315.  
  316. /*
  317.  * Decode 2 screen bytes.
  318.  */
  319. int
  320. uniq(c)
  321.     register unsigned int c;
  322. {
  323.     register unsigned int dummy;    /* avoid a Megamax bug */
  324.  
  325.     c <<= 12;
  326.     c |= (fgetb() << 6);
  327.     c |= fgetb();
  328.     if (bferr)
  329.         return (ERROR);
  330.     return (putword(c));
  331. }
  332.  
  333. /*
  334.  * Decode a 4-byte repetition code.
  335.  */
  336. int
  337. reps(b)
  338.     register unsigned int b;
  339. {
  340.     register unsigned int c;
  341.  
  342.     b = ((b-0x10) << 2);
  343.     c = fgetb();
  344.     b |= (c >> 4);
  345.     c <<= 12;
  346.     c |= (fgetb() << 6);
  347.     c |= fgetb();
  348.     if (bferr)
  349.         return (ERROR);
  350.     while (b--) {
  351.         if (putword(c) == ERROR)
  352.             return (ERROR);
  353.     }
  354.     return (OK);
  355. }    
  356.